package sys_ctl

import (
	"net/http"
	"ubt-rbac-service/internal/app/model"
	"ubt-rbac-service/internal/app/model/sys_mod"
	"ubt-rbac-service/internal/app/service/sys_serv"
	"ubt-rbac-service/internal/app/util"
	"ubt-rbac-service/internal/core/convert"
	"ubt-rbac-service/internal/core/parse"
)

type sysBtn struct{}

var SysBtnCtl sysBtn

// Save 保存按钮
func (c *sysBtn) Save(w http.ResponseWriter, r *http.Request) {
	// 将请求的参数转换为请求结构体
	vo, errStr := parse.Parse(r, &sys_mod.SysBtnSaveReq{})
	if vo == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: errStr})
		return
	}
	req := vo.(*sys_mod.SysBtnSaveReq)
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	userId := userInfo.UserId
	// 过滤关键参数值中的非法字符
	req.BtnId = util.InputFilter(req.BtnId, true)
	req.BtnName = util.InputFilter(req.BtnName, true)
	req.BtnCode = util.InputFilter(req.BtnCode, true)
	req.ModId = util.InputFilter(req.ModId, true)
	// 判断编码是否重复
	extVo := &sys_mod.SysBtnExtVo{BtnId: req.BtnId, BtnCode: req.BtnCode, ModId: req.ModId}
	if ext := sys_serv.SysBtnServ.Exists(extVo); ext {
		util.ToJson(w, &model.ResJson{Code: 402, Msg: "对不起，填写的编码已存在，请更换！"})
		return
	}
	var (
		result *model.Result
		kind   uint8
	)
	if req.BtnId == "" {
		// 新增
		result = sys_serv.SysBtnServ.Add(req)
		kind = 1
	} else {
		// 修改
		result = sys_serv.SysBtnServ.Update(req)
		kind = 3
	}
	if result != nil && result.RetCode == 1001 {
		logReq := &sys_mod.SysLogSaveReq{UserId: userId, ModCode: "10010102", Kind: kind, OptOrg: userInfo.DeptId}
		sys_serv.SysLogServ.Add(logReq)
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok"})
	} else {
		util.ToJson(w, &model.ResJson{Code: 500, Msg: result.RetMsg})
	}
}

// Deletes 删除按钮
func (c *sysBtn) Deletes(w http.ResponseWriter, r *http.Request) {
	// 将请求的参数转换为请求结构体
	vo, errStr := parse.Parse(r, &sys_mod.SysBtnDelsReq{})
	if vo == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: errStr})
		return
	}
	req := vo.(*sys_mod.SysBtnDelsReq)
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	// 过滤关键参数值中的非法字符
	req.BtnIds = util.InputFilter(req.BtnIds, true)
	result := sys_serv.SysBtnServ.Deletes(req)
	if result != nil && result.RetCode == 1001 {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, ModCode: "10010102", Kind: 2, OptOrg: userInfo.DeptId}
		sys_serv.SysLogServ.Add(logReq)
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok"})
	} else {
		util.ToJson(w, &model.ResJson{Code: 500, Msg: result.RetMsg})
	}
}

// DelByMod 根据模块编号删除按钮
func (c *sysBtn) DelByMod(w http.ResponseWriter, r *http.Request) {
	// 将请求的参数转换为请求结构体
	vo, errStr := parse.Parse(r, &sys_mod.SysBtnDelReq{})
	if vo == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: errStr})
		return
	}
	req := vo.(*sys_mod.SysBtnDelReq)
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	// 过滤关键参数值中的非法字符
	req.BtnId = util.InputFilter(req.BtnId, true)
	result := sys_serv.SysBtnServ.DelByMod(req.BtnId)
	if result != nil && result.RetCode == 1001 {
		logReq := &sys_mod.SysLogSaveReq{UserId: userInfo.UserId, ModCode: "10010102", Kind: 2, OptOrg: userInfo.DeptId}
		sys_serv.SysLogServ.Add(logReq)
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok"})
	} else {
		util.ToJson(w, &model.ResJson{Code: 500, Msg: result.RetMsg})
	}
}

// One 获取按钮详情
func (c *sysBtn) One(w http.ResponseWriter, r *http.Request) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	u := r.URL.Query()
	if u == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: "对不起，请求的参数不能为空，请重试"})
		return
	}
	// 过滤关键参数值中的非法字符
	btnId := u.Get("btnId")
	// 过滤关键参数值中的非法字符
	btnId = util.InputFilter(btnId, true)
	if btnId == "" || len(btnId) != 21 {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: "对不起，请求的编号参数为空或不正确，请重试！"})
		return
	}
	result := sys_serv.SysBtnServ.One(btnId)
	if result != nil && result.RetCode == 1001 {
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok", Data: result.RetData})
	} else {
		util.ToJson(w, &model.ResJson{Code: 404, Msg: result.RetMsg})
	}
}

// Page 获取按钮树状列表
func (c *sysBtn) Page(w http.ResponseWriter, r *http.Request) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	u := r.URL.Query()
	if u == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: "对不起，请求的参数不能为空，请重试"})
		return
	}
	schName := u.Get("schName")
	modId := u.Get("modId")
	limits := u.Get("limit")
	offsets := u.Get("offset")
	schName = util.InputFilter(schName, false)
	modId = util.InputFilter(modId, true)
	limits = util.InputFilter(limits, true)
	offsets = util.InputFilter(offsets, true)
	limit := convert.Str2u8(limits)
	offset := convert.Str2u32(offsets)
	// 先统计信息的数量
	req := &sys_mod.SysBtnPageReq{SchName: schName, ModId: modId}
	if result := sys_serv.SysBtnServ.Count(req); result != nil && result.RetCode == 1001 && result.RetData.(int64) > 0 {
		res := &sys_mod.SysBtnPageRes{Total: result.RetData.(int64)}
		// 再查询具体的信息列表
		req.Limit = limit
		req.Offset = offset
		if result = sys_serv.SysBtnServ.Page(req); result != nil && result.RetCode == 1001 {
			res.List = result.RetData
			util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok", Data: res})
			return
		}
	}
	util.ToJson(w, &model.ResJson{Code: 404, Msg: "暂无内容"})
}

// Select 获取按钮下拉的树状列表
func (c *sysBtn) Select(w http.ResponseWriter, r *http.Request) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	u := r.URL.Query()
	if u == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: "对不起，请求的参数不能为空，请重试"})
		return
	}
	result := sys_serv.SysBtnServ.Select()
	if result != nil && result.RetCode == 1001 {
		util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok", Data: result.RetData})
	} else {
		util.ToJson(w, &model.ResJson{Code: 404, Msg: result.RetMsg})
	}
}

// Sort 获取数量，用于排序
func (c *sysBtn) Sort(w http.ResponseWriter, r *http.Request) {
	// 通过头部请求的token获取用户信息
	token := r.Header.Get("token")
	userInfo := util.GetUserInfo(token)
	if userInfo == nil {
		util.ToJson(w, &model.ResJson{Code: 401, Msg: "对不起，您未登录或登录超时，请登录！"})
		return
	}
	u := r.URL.Query()
	if u == nil {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: "对不起，请求的参数不能为空，请重试"})
		return
	}
	modId := u.Get("modId")
	modId = util.InputFilter(modId, true)
	if modId == "" {
		util.ToJson(w, &model.ResJson{Code: 400, Msg: "对不起，请求的参数为空或不正确，请重试！"})
		return
	}
	result := sys_serv.SysBtnServ.Sort(modId)
	util.ToJson(w, &model.ResJson{Code: 200, Msg: "ok", Data: result.RetData})
}
